﻿using System;
using System.Linq;
using System.Web.Mvc;
using NHibernate;
using Web.Entities;
using Web.Entities.Enums;
using Web.Extensions;
using Web.HelperClasses.Inflexion;
using Web.NetworkWorkers;

namespace Web.Controllers
{
    public class InflectionController : Controller
    {
		[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Head)]
        public ActionResult Index()
        {
			//просматривать текущие сохранённые склонения можно только админу
			if (userSession.CurrentUser == null || !userSession.CurrentUser.IsAdmin) throw new UnauthorizedAccessException();

        	var inflections = session
        		.CreateCriteria<Inflection>()
				.List<Inflection>(); 
			var cases = Enum.GetNames(typeof (Case)).Select(caseName => new SelectListItem() {Text = caseName, Value = caseName});
			return View(Tuple.Create(inflections, cases));
        }

        [HttpPost]
        public void Create(string NormalForm, bool Singular, string Case, string ResultForm)
        {
			//создавать варианты склонения можно только админу
			if (userSession.CurrentUser == null || !userSession.CurrentUser.IsAdmin) throw new UnauthorizedAccessException();

			var inflection = new Inflection()
			{
				NormalForm = NormalForm,
				Singular = Singular,
				Case = (Case) Enum.Parse(typeof(Case), Case),
				ResultForm = ResultForm
			};
			session.Save(inflection);
        }

		[HttpPost]
		public void CreateUsingYandex(string NormalForm, bool Singular, string Case)
		{
			//создавать варианты склонения можно только админу
			if (userSession.CurrentUser == null || !userSession.CurrentUser.IsAdmin) throw new UnauthorizedAccessException();
			
			Case wordCase = (Case) Enum.Parse(typeof (Case), Case);
			inflector.Inflect(NormalForm, wordCase, Singular);
		}

        //
        // POST: /Inflection/Delete/5

        [HttpPost]
        public void Delete(int id)
        {
			//удалять варианты склонения можно только админу
			if (userSession.CurrentUser == null || !userSession.CurrentUser.IsAdmin) throw new UnauthorizedAccessException();

        	var inflection = session.Get<Inflection>(id);
        	session.Delete(inflection);
			return;
        }

    	public InflectionController(IUserSession userSession, ISession session)
    	{
    		this.userSession = userSession;
    		this.session = session;
			//todo поместить создание в конструктор, т.к. контейнер должен сам суметь создать
			this.inflector = new YaInflector(session, new NetworkHelper(), new InflectionFactory());
    	}

    	readonly IUserSession userSession;
		readonly ISession session;
    	readonly IInflector inflector;
    }
}
